#ifndef IDENTIFICATORTABLE
#define IDENTIFICATORTABLE

#include <string>
#include <map>

/**
	@brief niveau d'erreur

	niveau d'erreur sur la table des identificateurs (pour les exceptions de type Error)
*/
#define IDENTIFICATORTABLE_LEVEL_ERROR			2

/**
	@brief code d'erreur

	code d'erreur en cas d'index non associé à un identificateur
*/
#define IDENTIFICATORTABLE_UNASSIGNED_INDEX			1

/**
	@class IdentificatorTable
	@brief classe de gestion des identificateurs

	cette classe gère les identificateurs de manière globale (une table commune pour tous les contextes). Cette table permet de manipuler des entiers en lieu et place des chaines de caratères.
*/
class IdentificatorTable
{
	public:
		/**
			@brief constructeur

			initialise la table des identificateurs
		*/
		IdentificatorTable ();
		/**
			@brief destructeur

			vide la table des symboles
		*/
		~IdentificatorTable ();
		/**
			@brief enregistrement d'un identificateur

			enregistre un identificateur et renvoie son index dans la table des identificateurs
			@param [in] name le nom de l'identificateur à ajouter
			@return l'index de l'identificateur dans la table
		*/
		unsigned int addIdentificator ( const std::string& name );
		/**
			@brief accès au nom d'un identificateur

			accède au nomd' un identificateur à partir de son index dans la table des identificateurs
			@param [in] index l'index de l'identificateur dans la table
			@return le nom de l'identificateur à ajouter
		*/
		const std::string& getNameOf ( const unsigned int index ) const;
		/**
            @brief gestion des identificateurs

            accède à l'indice d'un identificateur dans la table
            @param [in] name la chaine de caractère associée à l'identificateur
            @return l'indice de l'identificateur dans la table
        */
		const unsigned int getIndexOf ( const std::string& name ) const;
	private:
		/// mapping index vers nom
		std::map < unsigned int, std::string > _indexToName;
		/// mapping nom vers index
		std::map < std::string, unsigned int > _nameToIndex;
		/// index à utiliser pour le prochain identificateur
		unsigned int _nextIndex;
};

#endif
